#include "file.h"

//从文件加载数据到链表
int load_from_file(ServerConfig *config) {
    // 打开文件（只读）
    FILE *fp = fopen(config->data_file, "r");
    if (fp == NULL) {
        perror("文件加载失败：无法打开文件（如为首次运行，可忽略）");
        return -1;  // 首次运行文件不存在，返回失败但不影响启动
    }

    // 清空现有链表（避免重复加载）
    destroy_student_list();
    init_student_list();

    char line[256];  // 每行缓冲区
    int num;         // 序号
    char id[20], name[50], gender[10];
    int age;

    // 按行读取文件（格式：num id name gender age）
    while (fgets(line, sizeof(line), fp) != NULL) {
        // 解析一行数据（sscanf按格式提取）
        int ret = sscanf(line, "%d %s %s %s %d", &num, id, name, gender, &age);
        if (ret != 5) {  // 解析失败（格式错误）
            fprintf(stderr, "加载失败: 无效行格式：%s\n", line);
            continue;
        }
        // 插入链表（忽略返回值，即使失败也继续加载其他行）
        add_student(num, id, name, gender, age);
    }

    fclose(fp);
    printf("从文件加载数据成功：%s\n", config->data_file);
    return 0;
}

//将链表数据保存到文件
int save_to_file(ServerConfig *config) {
    // 打开文件（只写，覆盖原有内容）
    FILE *fp = fopen(config->data_file, "w");
    if (fp == NULL) {
        perror("保存失败: 文件无法打开");
        return -1;
    }

    pthread_mutex_lock(&g_list_mutex);  // 锁定链表防止并发修改

    // 遍历链表，写入文件（格式：num id name gender age\n）
    Student *temp = g_student_list;
    while (temp != NULL) {
        fprintf(fp, "%d %s %s %s %d\n", 
                temp->num, 
                temp->id, 
                temp->name, 
                temp->gender, 
                temp->age);
        temp = temp->next;
    }

    pthread_mutex_unlock(&g_list_mutex);
    fclose(fp);
    printf("数据已保存到文件：%s\n", config->data_file);
    return 0;
}